package com.whcoding.test.common.list;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: snailthink
 * @description: 将List拆分
 * @author:
 * @create: 2021-07-03 11:01
 **/
public class SplitList {

	/**
	 * 将一个list均分成n个list,主要通过偏移量来实现的
	 * @param source 源集合
	 * @param n 拆分后的集合的个数
	 * @param <T>
	 * @return 拆分的集合集
	 */
	public static <T> List<List<T>> averageAssign(List<T> source, int n){
		if(CollectionUtils.isEmpty(source) ||n<2){
			return  null ;
		}
		List<List<T>> result=new ArrayList<List<T>>();
		//(先计算出余数)
		int remaider=source.size()%n;
		//然后是商
		int number=source.size()/n;
		//偏移量
		int offset=0;
		for(int i=0;i<n;i++){
			List<T> value=null;
			if(remaider>0){
				value=source.subList(i*number+offset, (i+1)*number+offset+1);
				remaider--;
				offset++;
			}else{
				value=source.subList(i*number+offset, (i+1)*number+offset);
			}
			result.add(value);
		}
		return result;
	}

	/**
	 * 将集合拆分指定大小的多个集合
	 * @param resList 源集合
	 * @param count 每个集合的大小
	 * @param <T> 泛型
	 * @return 拆分后的集合集
	 */
	public static  <T> List<List<T>> split(List<T> resList,int count){

		if(resList==null ||count<1){
			return  null ;
		}
		List<List<T>> ret=new ArrayList<List<T>>();
		int size=resList.size();
		//数据量不足count指定的大小
		if(size<=count){
			ret.add(resList);
		}else{
			int pre=size/count;
			int last=size%count;
			//前面pre个集合，每个大小都是count个元素
			for(int i=0;i<pre;i++){
				List<T> itemList=new ArrayList<T>();
				for(int j=0;j<count;j++){
					itemList.add(resList.get(i*count+j));
				}
				ret.add(itemList);
			}
			//last的进行处理
			if(last>0){
				List<T> itemList=new ArrayList<T>();
				for(int i=0;i<last;i++){
					itemList.add(resList.get(pre*count+i));
				}
				ret.add(itemList);
			}
		}
		return ret;

	}
}